home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / LANG / C / LIB / UNIXLIB37B / !UnixLib37 / src / signal / s / sigexec < prev   
Text File  |  1996-11-09  |  3KB  |  100 lines

  1. ;----------------------------------------------------------------------------
  2. ;
  3. ; $Source: /unixb/home/unixlib/source/unixlib37/src/signal/s/RCS/sigexec,v $
  4. ; $Date: 1996/11/06 22:01:42 $
  5. ; $Revision: 1.2 $
  6. ; $State: Rel $
  7. ; $Author: unixlib $
  8. ;
  9. ; $Log: sigexec,v $
  10. ; Revision 1.2  1996/11/06 22:01:42  unixlib
  11. ; Yet more changes by NB, PB and SC.
  12. ;
  13. ; Revision 1.1  1996/10/30 21:57:16  unixlib
  14. ; Initial revision
  15. ;
  16. ;----------------------------------------------------------------------------
  17. ; signal.s.sigexec: Written by Nick Burrett, 1 September 1996.
  18.  
  19.     GET    Unix37:unixlib.s.asm_dec
  20.  
  21.     AREA    |C$$code|,CODE,READONLY
  22.  
  23.     ; Low level functions used to setup stack frames and call the
  24.     ; signal handler. These are called by __unixlib_setup_sighandler.
  25.  
  26.     EXPORT    |__unixlib_exec_sig|
  27.     ; Setup a signal handler to execute on the current stack.
  28. |__unixlib_exec_sig|
  29.     MOV    ip, sp
  30.     STMFD    sp!, {v1, v2, v3, v4, v5, v6, fp, ip, lr, pc}
  31.     SUB    fp, ip, #4
  32.     ; Call the signal handler
  33.     MOV    a3, a1
  34.     MOV    a1, a2
  35.     MOV    lr, pc
  36.     MOV    pc, a3
  37.     LDMEA    fp, {v1, v2, v3, v4, v5, v6, fp, sp, pc}^
  38.  
  39.  
  40.     EXPORT    |__unixlib_exec_sigstack|
  41.         ; Execute a signal handler on an alternative stack
  42.     ; (sigaltstack for POSIX).
  43. |__unixlib_exec_sigstack|
  44.     STMFD    sp!, {a3, a4, v1, v2, v3, v4, v5, v6, sl, fp, ip, lr}
  45.     ; Preserve sp
  46.     MOV    v1, sp
  47.     ; Switch to the signal stack, setting it up for a proper
  48.     ; APCS stack frame.
  49.     MOV    fp, #0
  50.     ADD    sp, a1, a2
  51.     ; Pad the stack chunk limit in case we run out of room.
  52.     ADD    sl, a1, #512
  53.     ; Call the signal handler
  54.     MOV    a1, a4
  55.     MOV    lr, pc
  56.     MOV    pc, a3
  57.     MOV    sp, v1
  58.     LDMFD    sp!, {a3, a4, v1, v2, v3, v4, v5, v6, sl, fp, ip, pc}^
  59.  
  60.     EXPORT    |__unixlib_exec_sigstack_bsd|
  61.     ; Execute a signal handler on an alternative stack
  62.     ; (sigstack for BSD).
  63. |__unixlib_exec_sigstack_bsd|
  64.     STMFD    sp!, {a3, a4, v1, v2, v3, v4, v5, v6, sl, fp, ip, lr}
  65.     ; Preserve sp
  66.     MOV    v1, sp
  67.     ; Switch to the signal stack, setting it up for a proper
  68.     ; APCS stack frame.
  69.     MOV    fp, #0
  70.     MOV    sp, a1
  71.     ; Under BSD, we don't know the size of the signal stack. Let's
  72.     ; make up a value and hope for the best.
  73.     SUB    sl, sp, #16384
  74.     ; Call the signal handler
  75.     MOV    a1, a3
  76.     MOV    lr, pc
  77.     MOV    pc, a2
  78.     MOV    sp, v1
  79.     LDMFD    sp!, {a3, a4, v1, v2, v3, v4, v5, v6, sl, fp, ip, pc}^
  80.  
  81.     EXPORT    |__unixlib_exec_sig_interrupt|
  82.     IMPORT    raise
  83.         ; Execute a signal handler on the current stack. This would be
  84.     ; used where the operating system has caused the signal
  85. |__unixlib_exec_sig_interrupt|
  86.     STMFD    sp!, {a2, a3, a4, v1, v2, v3, v4, v5, v6, sl, fp, ip, lr}
  87.     ; Preserve sp
  88.     MOV    v1, sp
  89.     ; Pretend to have a fresh stack frame
  90.     MOV    fp, #0
  91.     ; Pad the stack chunk limit in case we run out of room.
  92.     SUB    sl, sp, #512
  93.     ; Raise the signal
  94.     BL    raise
  95.     MOV    sp, v1
  96.     LDMFD    sp!, {a2, a3, a4, v1, v2, v3, v4, v5, v6, sl, fp, ip, pc}^
  97.  
  98.  
  99.     END
  100.